package com.tedu.API.list;

import org.junit.Test;

import java.util.*;
import java.util.LinkedList;

/**
 * Collection集合下  子集合【队列】  包位置 java.util
 * Queue  队列       单端队列
 * Deque  队列       双端队列    Deque接口 继承  Queue接口
 * 作用： 保存数据，有序的存储和处理，功能：数据缓冲或者多线程协调工作！！
 *
 * 队列的实现类
 * LinkedList:双向链表
 *
 */
public class QueueAPI {
    //Queue  队列  单端队列
    @Test
    public void testQueue() {
        //创建队列---多态--LinkedList
        Queue<String> queue = new LinkedList<>();
        /**
         *offer() ---add()一样
         * 作用：入队操作,对尾追加元素
         */
        queue.offer("青花瓷");
        queue.offer("冬眠");
        queue.offer("体面");
        queue.offer("倒带");
        System.out.println("Queue队列打印状态" + queue);
        /**
         * poll() 返回值：E
         * 作用：出队操作，获取队首元素，并且删除队列中对首
         * peek()  返回值 E
         * 作用：出队操作，获取队首元素，不删除队列中的队首
         *
         */
        queue.poll(); //删除队首元素
        queue.poll();
        System.out.println("Queue队列" + queue);
        String str = queue.peek();
        System.out.println("队首元素" + str);
        System.out.println("Queue队列" + queue);

        /**
         * 需求：1.遍历对列--while---只遍历一次【队列元素消失】
         * 需求：2.增强for遍历，队列元素继续存在
         */
//        while (!queue.isEmpty()){//queue.size()>0 队列有元素  遍历
//            str=queue.poll();  //获取队首，删除队首
//            System.out.println("获取的队列元素"+str);
//        }
//        System.out.println("Queue的队列元素"+queue);

        /**
         * for条件 ： E e 数组泛型|集合泛型：数组引用|集合引用
         */
        for (String q : queue) {//增强for--底层Iterator遍历
            System.out.println("获取队列元素" + q);
        }
        System.out.println("Queue的队列元素" + queue);
    }

    @Test
    public void testDeque() {
        //创建Deque 双端队列 方法基本一致，部分方法不一致
        Deque<String> deque = new LinkedList<>();
        deque.offer("任贤齐");
        deque.offer("王菲");
        deque.offer("毛阿敏");
        deque.offer("那英");
        System.out.println("双端队列" + deque);
        //offerFirst() 队首添加元素   offerLast() 对尾添加元素
        deque.offerFirst("蔡徐坤");
        deque.offerLast("薛之谦");
        System.out.println("双端队列【首尾添加元素】" + deque);
        //getFirst() 获取队首       getLast() 获取队尾  【单端队列：peek类似】
        System.out.println("获取队列中队首"+deque.getFirst());
        System.out.println("获取队列中对尾"+deque.getLast());
        //pollFirst()获取队首，删除队列中的队首  【单端：poll类似】
        //pollLast() 获取队尾，删除队列的队尾
        deque.pollFirst();
        deque.pollLast();
        System.out.println("删除队列中队首队尾"+deque);
    }
    /**
     * 栈结构:业务中如果有后退【撤销】情况使用
     * 双端队列支持栈结构--提供相应的方法实现栈结构
     */
    @Test
    public void testStack(){
        //创建双端队列---支持栈结构
        Deque<String> stack=new LinkedList<>();
        /**
         * push:Deque 独有的方法---支持栈结构  --offer:Queue--add:Collection 【添加】
         * 作用：【添加：往栈中压入一个元素】 压栈操作
         *
         */
        stack.push("夯大力");
        stack.push("恶搞之家");
        stack.push("喜羊羊");
        stack.push("魔方大厦");
        System.out.println("栈结构:"+stack);
        /**
         * pop()  出栈一个尾元素  --pollList类似【拿先入后出，最后一个压栈元素】
         */
        String list=stack.pop();
        System.out.println("出栈元素尾"+list);
        System.out.println("栈结构"+stack);
        //pop,poll,peek的使用区别？
        /**
         * 需求：遍历一个栈结构--while---元素出栈，队列元素清空
         * 需求：遍历栈结构---增强for--元素遍历成功后队列元素不变
         */
        while(!stack.isEmpty()){
            String str=stack.pop();
            System.out.println("出栈元素"+str);

        }
        System.out.println("出栈后的栈集合"+stack);

        //需求2
        for (String sack:stack){
            System.out.println("遍历元素不删除"+sack);
        }
        System.out.println("遍历后的元素"+stack);
    }

}
